package cn.tannn.surenessdemo.redis.service;

import cn.tannn.surenessdemo.sureness.processor.RedisAccount;

import java.util.List;
import java.util.Set;

/**
 * redis
 *
 * @author tnnn
 * @version V1.0
 * @date 2022-07-22 14:06
 */
public interface RedisService {

    /**
     * 存放 用户角色
     * 根据用户去数据库查询
     * @param username 用户唯一值
     */
    void storageUserRole(String username);


    /**
     * 存放 用户角色
     * 如果之前查了就直接存
     * @param username 用户唯一值
     * @param roles 用户角色
     */
    void storageUserRole(String username,  List<String> roles);


    /**
     * 刷新所有用户的权限
     * 如果之前查了就直接存
     */
    void refreshRoleAll();

    /**
     * 加载用户权限
     * @param username 用户唯一值
     * @return List
     */
    List<String> loadUserRole(String username);

    /**
     * 存放 用户TOKEN
     *
     * @param username 用户唯一值
     * @param token jwt
     */
    void storageUserToken(String username, String token);

    /**
     * 刷新用户token
     * @param username 用户唯一值
     */
    void refreshUserToken(String username);


    /**
     * 删除 用户TOKEN
     *
     * @param username 用户唯一值
     */
    void removeUserToken(String username);


    /**
     * 验证 用户TOKEN是否存在，存在则返回 token
     * @param username 用户唯一值
     * @return tokenRedis
     */
    String verifyUserToken(String username);


    /**
     * 验证用户的状态
     * 有问题则异常
     * @param username 用户唯一值
     */
    void verifyUserStatus(String username);

    /**
     * 存储 用户的状态
     * @param account 用户
     */
    void storageUserStatus(RedisAccount account);

    /**
     * 加载用户的状态
     * 有问题则异常
     * @param username 用户唯一值
     * @return  SurenessAccount
     */
    RedisAccount loadUserStatus(String username);

    /**
     * 存储 需要拦截的资源数据
     * @param jsonStr 资源
     */
    void storageEnableResource(Set<String> jsonStr);

    /**
     * 加载redis中 需要拦截的资源数据
     * @return Set
     */
    Set<String> loadEnableResource();



    /**
     * 查询数据库后在加载redis中 需要拦截的资源数据
     * @return Set
     */
    Set<String> loadEnableResourceMysqlLoad();


    /**
     * 存储 不需要拦截的资源数据
     * @param jsonStr 资源
     */
    void storageDisableResource(Set<String> jsonStr);


    /**
     * 加载redis中 不需要拦截的资源数据
     * @return Set
     */
    Set<String> loadDisableResource();


    /**
     * 查询数据库后在加载redis中 不需要拦截的资源数据
     *
     * @return Set
     */
    Set<String> loadDisableResourceMysqlLoad();

    /**
     * 需要拦截的资源
     * @param context getContextPath()
     * @return resources
     */
    Set<String> providePathData(String context);

    /**
     * 不被拦截的资源
     * @param context getContextPath()
     * @return resources
     */
    Set<String> provideExcludedResource(String context);


}
